package code;

import com.intellij.ide.highlighter.JavaFileType;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
import utils.PluginUtils;

import java.util.Map;

/**
 * 数据库代码生成类
 */
public class DBGenerator {

    /**
     * 生成 DatabaseHelper.java 文件
     * priKeyField 表示用户设置的主键
     */
    public static void generatorDbHelperFile(Project project, PsiClass psiClass, Map<String, String> map, PsiField priKeyField, VirtualFile dbDir) {
        String fileName = "DatabaseHelper.java";
        VirtualFile child = dbDir.findChild(fileName);
        if (child == null) {
            // 没有就创建一个，第一次使用代码字符串创建一个类
            PsiFile initFile = PsiFileFactory.getInstance(project).createFileFromText(fileName, JavaFileType.INSTANCE,
                    CodeFactory.genSQLiteOpenHelperInitCode(project));
            // 添加到db目录
            PsiManager.getInstance(project).findDirectory(dbDir).add(initFile);
            child = dbDir.findChild(fileName);
        }

        PsiFile psiFile = PsiManager.getInstance(project).findFile(child);
        // 用拼接的代码生成 create table 方法
        String createTableCode = CodeFactory.genCreateTableCode(psiClass, map, priKeyField);
        PsiElementFactory factory = JavaPsiFacade.getInstance(project).getElementFactory();
        PsiMethod createTableMethod = factory.createMethodFromText(createTableCode, psiFile);

        // 获取DatabaseHelper类的PsiClass
        PsiClass fileClass = PluginUtils.getFileClass(psiFile);
        // 将创建的method添加到DatabaseHelper Class中
        fileClass.add(createTableMethod);
        // 获取DatabaseHelper类的onCreate方法
        PsiMethod onCreateMethod = fileClass.findMethodsByName("onCreate", false)[0];
        // 在DatabaseHelper类中的onCreate方法里，添加create table方法的调用语句
        onCreateMethod.getBody().add(factory.createStatementFromText(createTableMethod.getName() + "(db);", fileClass));
    }


    /**
     * 生成 XXXDao.java 文件
     */
    public static void generatorDaoCodeFile(Project project, PsiClass psiClass, String entryPackageName, Map<String, String> map, PsiField priKeyField, VirtualFile dbDir) {
        String fileName = psiClass.getName() + "Dao.java";

        // 使用代码字符串创建个类
        PsiFile initFile = PsiFileFactory.getInstance(project).createFileFromText(
                fileName, JavaFileType.INSTANCE, CodeFactory.genDaoCode(project, psiClass,entryPackageName, map, priKeyField));

        // 加到db目录下
        PsiManager.getInstance(project).findDirectory(dbDir).add(initFile);
    }

}
